#include "ir1838.h"
#include "task.h"
#include "exti.h"
#include "STC89C5xRC.H"
#include "lcd1602.h"

#if IR1838_TASK

/* define your data start */
static volatile ir1838_t ir1838_panel;
static uint8_t code lcd1602_code_num[16] = "0123456789ABCDEF";
uint8_t lcd1602_dis_num_str[11] = "          ";
/* define your data start */

/**
 * @brief ir1838_handle_dis
 *
 */
static void ir1838_handle_dis(void)
{
    lcd1602_dis_num_str[0] = lcd1602_code_num[ir1838_panel.ir_code[0] / 16];
    lcd1602_dis_num_str[1] = lcd1602_code_num[ir1838_panel.ir_code[0] % 16];
    lcd1602_dis_num_str[3] = lcd1602_code_num[ir1838_panel.ir_code[1] / 16];
    lcd1602_dis_num_str[4] = lcd1602_code_num[ir1838_panel.ir_code[1] % 16];
    lcd1602_dis_num_str[6] = lcd1602_code_num[ir1838_panel.ir_code[2] / 16];
    lcd1602_dis_num_str[7] = lcd1602_code_num[ir1838_panel.ir_code[2] % 16];
    lcd1602_dis_num_str[9] = lcd1602_code_num[ir1838_panel.ir_code[3] / 16];
    lcd1602_dis_num_str[10] = lcd1602_code_num[ir1838_panel.ir_code[3] % 16];

    lcd1602_display_str(0, 0, "IR1838 demo     ");
    lcd1602_display_str(0, 1, "code:");
    lcd1602_display_str(5, 1, lcd1602_dis_num_str);
}

/**
 * @brief ir1838_handle_cord
 *
 */
static void ir1838_handle_cord(void) // 红外码值处理函数
{
    unsigned char i, j, k;
    unsigned char cord, value;

    k = 1;
    for (i = 0; i < 4; i++) // 处理4个字节
    {
        for (j = 1; j <= 8; j++) // 处理1个字节8位
        {
            cord = ir1838_panel.ir_data[k];
            if (cord > 6) // 大于某值为1，这个和晶振有绝对关系，这里使用12M计算，此值可以有一定误差
            {
                value = value | 0x80;
            }
            else
            {
                value = value;
            }
            if (j < 8)
            {
                value = value >> 1;
            }
            k++;
        }
        ir1838_panel.ir_code[i] = value;
        value = 0;
    }
    ir1838_panel.ir_pro_ok = 1; // 处理完毕标志位置1
}

/**
 * @brief ir1838_struct_panel
 *
 * @return &ir1838_t
 */
ir1838_t *ir1838_struct_panel(void)
{
    return &ir1838_panel;
}

/**
 * @brief ir1838_exti_handle
 *
 */
void ir1838_exti_handle(void)
{
    static uint8_t i;      // 接收红外信号处理
    static bool startflag; // 是否开始处理标志位

    if (startflag)
    {
        if (ir1838_panel.ir_time < 63 && ir1838_panel.ir_time >= 33) // 引导码 TC9012的头码，9ms+4.5ms
        {
            i = 0;
        }

        ir1838_panel.ir_data[i] = ir1838_panel.ir_time; // 存储每个电平的持续时间，用于以后判断是0还是1
        ir1838_panel.ir_time = 0;

        i++;
        if (i == 33)
        {
            ir1838_panel.ir_ok = 1;
            i = 0;
        }
    }
    else
    {
        ir1838_panel.ir_time = 0;
        startflag = 1;
    }
}

/**
 * @brief ir1838_init
 *
 */
void ir1838_init(void)
{
    exti0_init(FALLING); // init exti_0
}

/**
 * @brief ir1838_proc
 *
 */
void ir1838_demo(void)
{
    if (ir1838_panel.ir_ok) // 如果接收好了进行红外处理
    {
        ir1838_handle_cord();
        ir1838_panel.ir_ok = 0;
    }

    if (ir1838_panel.ir_pro_ok) // 如果处理好后进行工作处理，如按对应的按键后显示对应的数字等
    {
        ir1838_handle_dis();
#if IR1838_DEBUG
        printf("code: %bu-%bu-%bu-%bu\r\n", ir1838_panel.ir_code[0], ir1838_panel.ir_code[1], ir1838_panel.ir_code[2], ir1838_panel.ir_code[3]);
#endif
        ir1838_panel.ir_pro_ok = 0; // 处理完成后清楚标志位
    }
}

#endif